
package es.ceu.mp2.conway;

import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import org.apache.log4j.Logger;


public class TXTReader implements Reader{

    private static final Logger log = Logger.getLogger(TXTReader.class);


    public GameBoard read(String fileName) {
        GameBoard board;
        try{
            board = getGameSize(fileName);
            
            log.debug("Se va a abrir el fichero");
            FileReader fileReader = new FileReader(fileName);
            LineNumberReader lineReader = new LineNumberReader(fileReader);

            String line;
            for (int row = 0; (line = lineReader.readLine()) != null; row++)
                loadLine (board, line, row);
            log.debug("Fichero leido correctamente");

            return board;
        }catch (IOException ex){
            log.error("Error en la apertura del fichero: "+ ex.getMessage());
            throw new FileFormatException("Error en la apertura del fichero");
        }

        
    }

    private GameBoard loadLine (GameBoard board, String line, int row){
        char c;

        for (int i = 1; i < line.length(); i = i + 2){
            if ((line.charAt(i)) != ','){
                log.error("Fichero de texto creado incorrectamente. Se ha encontrado '" + line.charAt(i) + "' en lugar de ','");
                throw new FileFormatException("Fichero de texto creado incorrectamente. Se ha encontrado '" + line.charAt(i) + "' en lugar de ','");
            }
        }

        for (int i = 0; i < line.length(); i = i + 2){
            c = line.charAt(i);
            if (c == '1')
                board.setCellAlive(row, i/2);

            else if (c != '0'){
                log.error("Fichero de texto creado incorrectamente. Se ha encontrado '" + line.charAt(i) + "' en lugar de '0' o '1'");
                throw new FileFormatException("Fichero de texto creado incorrectamente. Se ha encontrado '" + line.charAt(i) + "' en lugar de '0' o '1'");
            }
        }

        return board;
    }

    private GameBoard getGameSize(String fileName) throws IOException {
        int rows, columns;
        FileReader fileReader = new FileReader(fileName);
        LineNumberReader lineReader = new LineNumberReader(fileReader);

        String line = lineReader.readLine();
        if (line == null){
            log.error("Fichero de texto vacio.");
            throw new FileFormatException(" Fichero de texto vacio.");
        }
        columns = (line.length() + 1) / 2;
        for (rows = 1; (line = lineReader.readLine()) != null; rows++) {
            if ((line.length() + 1)/2 != columns){
                log.error("Fichero de texto creado incorrectamente. Longitud de la fila" + (rows + 1) + "incorrecta");
                throw new FileFormatException("Fichero de texto creado incorrectamente. Longitud de la fila" + (rows + 1) + "incorrecta");
            }
        }
        return new GameBoard(rows,columns);
    }

}
